
package com.axc.gallery2.edit.color;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;

import com.axc.gallery2.function.IPicEdit5;

public class ToChangeColor implements IPicEdit5 {

    private ColorMatrix mLightnessMatrix;
    private ColorMatrix mSaturationMatrix;
    private ColorMatrix mHueMatrix;
    private ColorMatrix mAllMatrix;

    public static final int FLAG_SATURATION = 0x0;
    public static final int FLAG_LUM = 0x1;
    public static final int FLAG_HUE = 0x2;

    @Override
    public Bitmap ProcessWork(Bitmap bm, int flag, float mHueValue,
            float mSaturationValue, float mLumValue) {
        Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
                Bitmap.Config.ARGB_8888);
        // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片
        Canvas canvas = new Canvas(bmp); // 得到画笔对象
        Paint paint = new Paint(); // 新建paint
        paint.setAntiAlias(true); // 设置抗锯齿,也即是边缘做平滑处理
        if (null == mAllMatrix) {
            mAllMatrix = new ColorMatrix();
        }

        if (null == mLightnessMatrix) {
            mLightnessMatrix = new ColorMatrix(); // 用于颜色变换的矩阵，android位图颜色变化处理主要是靠该对象完成
        }

        if (null == mSaturationMatrix) {
            mSaturationMatrix = new ColorMatrix();
        }

        if (null == mHueMatrix) {
            mHueMatrix = new ColorMatrix();
        }

        switch (flag) {
            case FLAG_HUE: // 需要改变色相

                mHueMatrix.reset();
                mHueMatrix.setScale(mHueValue, mHueValue, mHueValue, 1); // 红、绿、蓝三分量按相同的比例,最后一个参数1表示透明度不做变化，此函数详细说明参考
                /*
                 * mHueMatrix.setScale(mHueValue, mHueValue, mHueValue, 1);
                 * mSaturationMatrix.setSaturation(mSaturationValue);
                 * mLightnessMatrix.setRotate(0, mLumValue); // 控制让红色区在色轮上旋转的角度
                 * mLightnessMatrix.setRotate(1, mLumValue); // 控制让绿红色区在色轮上旋转的角度
                 * mLightnessMatrix.setRotate(2, mLumValue); // 控制让蓝色区在色轮上旋转的角度
                 */

                break;
            case FLAG_SATURATION: // 需要改变饱和度

                // saturation 饱和度值，最小可设为0，此时对应的是灰度图(也就是俗话的“黑白图”)，
                // 为1表示饱和度不变，设置大于1，就显示过饱和 mSaturationMatrix.reset();
                mSaturationMatrix.setSaturation(mSaturationValue);

                /*
                 * mHueMatrix.setScale(mHueValue, mHueValue, mHueValue, 1);
                 * mSaturationMatrix.setSaturation(mSaturationValue);
                 * mLightnessMatrix.setRotate(0, mLumValue); // 控制让红色区在色轮上旋转的角度
                 * mLightnessMatrix.setRotate(1, mLumValue); // 控制让绿红色区在色轮上旋转的角度
                 * mLightnessMatrix.setRotate(2, mLumValue); // 控制让蓝色区在色轮上旋转的角度
                 */
                break;

            case FLAG_LUM: // 亮度

                // hueColor就是色轮旋转的角度,正值表示顺时针旋转，负值表示逆时针旋转
                mLightnessMatrix.reset(); // 设为默认值
                mLightnessMatrix.setRotate(0, mLumValue); // 控制让红色区在色轮上旋转的角度
                mLightnessMatrix.setRotate(1, mLumValue); // 控制让绿红色区在色轮上旋转的角度
                mLightnessMatrix.setRotate(2, mLumValue); // 控制让蓝色区在色轮上旋转的角度 //
                // 这里相当于改变的是全图的色相

                /*
                 * mHueMatrix.setScale(mHueValue, mHueValue, mHueValue, 1);
                 * mSaturationMatrix.setSaturation(mSaturationValue);
                 * mLightnessMatrix.setRotate(0, mLumValue); // 控制让红色区在色轮上旋转的角度
                 * mLightnessMatrix.setRotate(1, mLumValue); // 控制让绿红色区在色轮上旋转的角度
                 * mLightnessMatrix.setRotate(2, mLumValue); // 控制让蓝色区在色轮上旋转的角度
                 */
                break;
        }
        mAllMatrix.reset();
        mAllMatrix.postConcat(mHueMatrix);
        mAllMatrix.postConcat(mSaturationMatrix); // 效果叠加
        mAllMatrix.postConcat(mLightnessMatrix); // 效果叠加

        paint.setColorFilter(new ColorMatrixColorFilter(mAllMatrix));// 设置颜色变换效果
        canvas.drawBitmap(bm, 0, 0, paint); // 将颜色变化后的图片输出到新创建的位图区
        // 返回新的位图，也即调色处理后的图片
        return bmp;
    }
}
